Terminate strncpy() buffers correctly
authorEmmanuele Bassi <ebassi@gnome.org>
Tue, 10 Apr 2018 13:51:27 +0000 (14:51 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 10 Apr 2018 13:54:45 +0000 (14:54 +0100)
When using strncpy() with a buffer we need to account for the
terminating NUL character. GCC 8 started warning when using PPD_MAX_NAME
as the buffer length for strncpy() because the buffer we're copying into
has the same length — which means that the terminating NUL may be
skipped if the source string has a length of PPD_MAX_NAME.

The appropriate way to handle the case where we're copying a source with
a length bigger than of PPD_MAX_NAME is, as reported in the strncpy()
documentation, to copy `PPD_MAX_NAME - 1` bytes, and explicitly NUL
terminate the destination buffer. This has the additional benefit of
avoiding the compiler warning.

modules/printbackends/gtkprintbackendcups.c

index 09e18b170ee3413f5462434448cd441f5cc0e5e3..52614069d242caba3cf3d66e08e173eccb8de406 100644 (file)
@@ -5590,7 +5590,10 @@ cups_printer_get_options (GtkPrinter           *printer,
          ppd_name = gtk_paper_size_get_ppd_name (paper_size);
 
          if (ppd_name)
-           strncpy (ppd_option->defchoice, ppd_name, PPD_MAX_NAME);
+            {
+              strncpy (ppd_option->defchoice, ppd_name, PPD_MAX_NAME - 1);
+              ppd_option->defchoice[PPD_MAX_NAME - 1] = '\0';
+            }
          else
            {
              gchar *custom_name;
@@ -5609,7 +5612,8 @@ cups_printer_get_options (GtkPrinter           *printer,
               * 230.4x142.9"
                */
              custom_name = g_strdup_printf (_("Custom %s×%s"), width, height);
-             strncpy (ppd_option->defchoice, custom_name, PPD_MAX_NAME);
+              strncpy (ppd_option->defchoice, custom_name, PPD_MAX_NAME - 1);
+              ppd_option->defchoice[PPD_MAX_NAME - 1] = '\0';
              g_free (custom_name);
            }
        }